package com.woniuxy.Factory;

import com.woniuxy.intface.Person;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * @Author：向天浩
 * @Date：2022/1/17 20:16
 * @Description :TODO
 * /**
 * *   1. Properties是Map接口的实现类。 拥有Map接口的中所有的方法。
 * *  2. Properties没有泛型，键和值都是String
 * *  3. 这个集合支持对流的操作，可以从流冲获取键值对。
 * * Object setProperty(String key, String value)：向Properties中添加键值对.
 * *   String getProperty(String key)： 根据key获取value。
 * *    Set<String> stringPropertyNames()：获取存放key的集合。
 * * ————————————————
 */


public class SingletonFactory {
    //创建一个静态属性
    static Map<String, Person> map = new HashMap<>();

    //加载静态代码块,来保证它是单利
    static {
        //创建Properties对象
        Properties properties = new Properties();
        //获取一个流
        InputStream resourceAsStream = SingletonFactory.class.getResourceAsStream("Person.properties");
        try {
            //加载这个流

            properties.load(resourceAsStream);
            //获取所有的key使用stringPropertyNames这个方法循环遍历获取key
            for (String key : properties.stringPropertyNames()) {
                //通过key获取对应的value值
                String property = properties.getProperty(key);
                //使用反射的方式，通过类全名，创建出该对象
                Person person = (Person) Class.forName(property).newInstance();
                //将key和创建出的对象加入到map中去
                map.put(key, person);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    //创建一个方法参数是keyname，返回值是Person
    public Person getbean(String keyName) {
        return map.get(keyName);
    }
}
